'use strict';

/**
 * 挂在 扩展方法到 ctx对象上
 */
module.exports = {
    axios,
    moment,
    uuidTool,
    // 获取合同编号
    getContractCode(branchCode) {
        return moment(new Date()).format('YYYY-MM') + '-' + branchCode + '-' + new Date().getTime();
    },
    // 获取UUID
    getUUID(key) {
        return uuidTool(key, this.app.config.uuid.secret).replace(/-/gi, '');
    },
    // 使用MD5加密字符串
    encryOfMD5(str) {
        const saltPassword = str + ':' + this.app.config.myJwt.secret;
        // 加盐密码的md5值
        const md5 = crypto.createHash('md5');
        return md5.update(saltPassword).digest('hex');
    },
    // 获取年
    getYear(date) {
        if (date) {
            return moment(date).format('YYYY');
        }
        return moment(new Date()).format('YYYY');
    },
    // 获取当前时间
    getDate_YYYY_MM_DD_HH_mm_ss(date) {
        if (date) {
            return moment(date).format(dateFormat.YYYY_MM_DD_HH_mm_ss);
        }
        return moment(new Date()).format(dateFormat.YYYY_MM_DD_HH_mm_ss);
    },
    // 获取当前时间
    getDate_YYYYMMDDHHmmss(date) {
        if (date) {
            return moment(date).format(dateFormat.YYYYMMDDHHmmss);
        }
        return moment(new Date()).format(dateFormat.YYYYMMDDHHmmss);
    },

    async getDatePlus1(val) {
        const reg = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/g;
        const arr = reg.exec(val);
        const date = new Date(arr[1], parseInt(arr[2]) - 1, arr[3], arr[4], arr[5], arr[6]);
        const dateStr = moment(date).format('YYYY/MM/DD HH:mm:ss');
        const result = moment(new Date(dateStr)).add(1, 'day').format(dateFormat.YYYYMMDDHHmmss);
        return result;
    },

    /*
     * 增加年份(+1)
     */
    addyear(val) {
        if (val) {
            return moment(val).add(1, 'y').format(dateFormat.YYYYMMDDHHmmss);
        }
        return moment(new Date()).add(1, 'y').format(dateFormat.YYYYMMDDHHmmss);
    },

    /**
     *
     * @param {*} card
     * 判断身份证号码
     */
    isCardNo(card) {
        // 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X
        const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
        if (reg.test(card) === false) {
            return false;
        }
    },

    /**
     *
     * @param {*} phone
     * 校验手机号
     */
    getphone(phone) {
        const data = /(^1[3456789]\d{9}$)|(^(0\d{2,3}\-)?([2-9]\d{6,7})+(\-\d{1,6})?$)/;
        if (data.test(phone) === false) {
            return false;
        }
    },
    /*
     *
     * @param {*} data
     * @param {*} format
     * 给万成龙格式化日期
     */
    getDateFormat(data) {
        if (!data) return;
        const reg = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/g;
        const arr = reg.exec(data);
        const date = new Date(arr[1], parseInt(arr[2]) - 1, arr[3], arr[4], arr[5], arr[6]);
        const result = moment(date).format('YYYY/MM/DD HH:mm:ss');
        return result;
    },
    // 获取年月日
    getYeardate(date) {
        if (date) {
            return moment(date).format('YYYY-MM-DD');
        }
        return moment(new Date()).format('YYYY-MM-DD');
    },
    // 生日转换
    getbirthday(date) {
        if (date) {
            return moment(date).format('YYYY/MM/DD');
        }
        return moment(new Date()).format('YYYY/MM/DD');
    },

    // 时间转换
    gettime(date) {
        if (date) {
            return moment(date).format('YYYY/MM/DD');
        }
        return moment(new Date()).format('YYYY/MM/DD');
    },
    // 获取指定格式的时间字符串
    DateUtils_getDateFormat(date, format) {
        if (!format) format = dateFormat.YYYYMMDDHHmmss;
        if (!date) date = new Date();
        return moment(date).format(format);
    },
    // 时间字符串转换
    DateUtils_GetDateString(dateStr, frontFormat, afterFormat) {
        if (!frontFormat) frontFormat = dateFormat.YYYYMMDDHHmmss;
        if (!afterFormat) afterFormat = dateFormat.YYYY_MM_DD_HH_mm_ss;
        return moment(dateStr, frontFormat).format(afterFormat);
    },
    // 时间字符串转换
    DateUtils_GetDate(dateStr, frontFormat) {
        if (!frontFormat) frontFormat = dateFormat.YYYYMMDDHHmmss;
        return moment(dateStr, frontFormat).toDate();
    },
    // 操作日期小时数
    DateUtils_getAddHours(hours, date) {
        if (!date) date = new Date();
        if (!hours) return date;
        return moment(date).add(hours, 'hours').toDate();
    },
    // 操作日期小时数
    DateUtils_getAddHoursStr(hours, date, formatStr) {
        if (!formatStr) formatStr = dateFormat.YYYYMMDDHHmmss;
        return moment(this.DateUtils_getAddHours(hours, date)).format(formatStr);
    },
    // 操作日期天数
    DateUtils_getAddDay(days, date) {
        if (!date) date = new Date();
        if (!days) return date;
        return moment(date).add(days, 'days').toDate();
    },
    // 操作日期天数
    DateUtils_getAddDayStr(days, date, formatStr) {
        if (!formatStr) formatStr = dateFormat.YYYYMMDDHHmmss;
        return moment(this.DateUtils_getAddDay(days, date)).format(formatStr);
    },
    // 操作日期月数
    DateUtils_getAddMonth(months, date) {
        if (!date) date = new Date();
        if (!months) return date;
        return moment(date).add(months, 'months').toDate();
    },
    // 操作日期月数
    DateUtils_getAddMonthStr(months, date, formatStr) {
        if (!formatStr) formatStr = dateFormat.YYYYMMDDHHmmss;
        return moment(this.DateUtils_getAddMonth(months, date)).format(formatStr);
    },
    // 操作日期年数
    DateUtils_getAddYears(years, date) {
        if (!date) date = new Date();
        if (!years) return date;
        return moment(date).add(years, 'years').toDate();
    },
    // 操作日期年数
    DateUtils_getAddYearsStr(years, date, formatStr) {
        if (!formatStr) formatStr = dateFormat.YYYYMMDDHHmmss;
        return moment(this.DateUtils_getAddYears(years, date)).format(formatStr);
    },
    async getAllMacAddr() {
        const result = await sysMacAddrService.findAllMacAddr(this.app);
        let res = [];
        if (result.length > 0) {
            res = result.map(obj => obj.mac_addr);
        }
        return res;
    },
    // 将范围数据补全成数组
    supplementScopeToArray(startNum, endNum) {
        const array = [];
        for (startNum; startNum <= endNum; startNum++) {
            array.push(startNum);
        }
        return array;
    },
    // 将时间戳转为日期格式
    timestampToTime(timestamp) {
        const date = new Date(timestamp * 1000); // 时间戳为10位需*1000，时间戳为13位的话不需乘1000
        const Y = date.getFullYear() + '-';
        const M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
        const D = date.getDate() + ' ';
        const h = date.getHours() + ':';
        const m = date.getMinutes() + ':';
        const s = date.getSeconds();
        return Y + M + D + h + m + s;
    }
};